package 开发商购买土地;

import java.util.Map;
import java.util.Scanner;

public class BuyLand {
    public static void main(String[] args) {
        /*
        题目描述
        在一个城市区域内，被划分成了n * m个连续的区块，每个区块都拥有不同的权值，代表着其土地价值。目前，有两家开发公司，A 公司和 B 公司，希望购买这个城市区域的土地。
        现在，需要将这个城市区域的所有区块分配给 A 公司和 B 公司。
        然而，由于城市规划的限制，只允许将区域按横向或纵向划分成两个子区域，而且每个子区域都必须包含一个或多个区块。
        为了确保公平竞争，你需要找到一种分配方式，使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。

        注意：区块不可再分。

        输入描述
        第一行输入两个正整数，代表 n 和 m。
        接下来的 n 行，每行输出 m 个正整数。

        输出描述
        请输出一个整数，代表两个子区域内土地总价值之间的最小差距。
        输入示例
        3 3
        1 2 3
        2 1 3
        1 2 3
        输出示例
        0
         */

        // horizontal  horizontalCut    vertical     verticalCut

        // 创建 n * m 的二维数组
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入行数：");
        int n = sc.nextInt();
        System.out.print("请输入列数：");
        int m = sc.nextInt();
        int[][] arr = new int[n][m];
        System.out.println("依次输入数据...");
        int sum = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int num = sc.nextInt();
                arr[i][j] = num;
                sum += num;
            }
        }

        // 存放每一行和的数据
        int[] horizontal = new int[n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                horizontal[i] += arr[i][j];
            }
        }

        // 存放每一列和的数据
        int[] vertical = new int[m];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                vertical[i] += arr[j][i];
            }
        }

        // 按行划分计算差值最小的情况
        int horizontalCut = 0;
        int result = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            horizontalCut += horizontal[i];
            result = Math.min( Math.abs(sum - 2 * horizontalCut), result);
        }

        // 按列划分计算差值最小的情况
        int verticalCut = 0;
        for (int i = 0; i < m; i++) {
            verticalCut += vertical[i];
            result = Math.min( Math.abs(sum - 2 * verticalCut), result);
        }

        System.out.println("最小差值为：" + result);

    }

    private static void Myprint(int[] horizontal) {
        for (int i = 0; i < horizontal.length; i++) {
            System.out.print(horizontal[i] + " ");
        }
        System.out.println();
    }


}
